package com.example.springboottest.example.unicode;

/**
 * 参考文章https://www.cnblogs.com/tsingke/p/10853936.html
 * 上个世纪60年代，美国制定了一套字符编码，对英语字符与二进制位之间的关系，做了统一规定。这被称为 ASCII 码，一直沿用至今,
 * ASCII 码一共规定了128个字符的编码
 * 至于亚洲国家的文字，使用的符号就更多了，汉字就多达10万左右。一个字节只能表示256种符号，肯定是不够的，就必须使用多个字节表达一个符号。
 * 比如，简体中文常见的编码方式是 GB2312，使用两个字节表示一个汉字，所以理论上最多可以表示 256 x 256 = 65536 个符号。
 * 比如，汉字严的 Unicode 是十六进制数4E25，转换成二进制数足足有15位（100111000100101），也就是说，这个符号的表示至少需要2个字节。
 * 表示其他更大的符号，可能需要3个字节或者4个字节，甚至更多。
 * <p>
 * 这里就有两个严重的问题:
 * 第一个问题是，如何才能区别 Unicode 和 ASCII ？计算机怎么知道三个字节表示一个符号，而不是分别表示三个符号呢？
 * 第二个问题是，我们已经知道，英文字母只用一个字节表示就够了，如果 Unicode 统一规定，每个符号用三个或四个字节表示，那么每个英文字母前都必然有二到三个字节是0，这对于存储来说是极大的浪费，文本文件的大小会因此大出二三倍，这是无法接受的。
 * UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16（字符用两个字节或四个字节表示）和 UTF-32（字符用四个字节表示），
 * 不过在互联网上基本不用。
 * 重复三遍：UTF-8 是 Unicode 的实现方式之一!!!
 * 重复三遍：ASCII 一个字节!!! Unicode 两个字节!!! UTF-8 使用一至四个字节为每个字符编码!!!
 * UTF-8 最大的一个特点，就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号，根据不同的符号而变化字节长度。 *
 * UTF-8 的编码规则很简单，只有二条： *
 * 1）对于单字节的符号，字节的第一位设为0，后面7位为这个符号的 Unicode 码。因此对于英语字母，UTF-8 编码和 ASCII 码是相同的。
 * 2）对于n字节的符号（n > 1），第一个字节的前n位都设为1，第n + 1位设为0，后面字节的前两位一律设为10。剩下的没有提及的二进制位，全部为这个符号的 Unicode 码。
 * 下面，还是以汉字严为例，演示如何实现 UTF-8 编码
 * 严的 Unicode 是4E25（100111000100101），
 * 根据上表，可以发现4E25处在第三行的范围内（0000 0800 - 0000 FFFF），
 * 因此严的 UTF-8 编码需要三个字节，即格式是1110xxxx 10xxxxxx 10xxxxxx。
 * 然后，从严的最后一个二进制位开始，依次从后向前填入格式中的x，多出的位补0。这样就得到了，
 * 严的 UTF-8 编码是11100100 10111000 10100101，转换成十六进制就是E4B8A5。
 * <p>
 * 可以看到严的 Unicode码 是4E25，UTF-8 编码是E4B8A5，两者是不一样的。它们之间的转换可以通过程序实现。
 */
public class UnicodeTest {
    public static void main(String[] args) {
        String ss = "\u6570\u636e\u672a\u5f55\u5165";
        System.out.println(ss + "--");
        String yan = "\u4E25";
        System.out.println(yan);
        int yan16 = 0x4e25;
        System.out.println(yan16);
        char yanChar = '严';
        int yanChar2Int = yanChar;
        System.out.println(yanChar2Int);

        outer:
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i == 2)
                    continue outer;
                System.out.println(i + "\t" + j);
            }
        }
    }

    public static String toUnicode(String s) {
        String as[] = new String[s.length()];
        String s1 = "";
        for (int i = 0; i < s.length(); i++) {
            as[i] = Integer.toHexString(s.charAt(i) & 0xffff);
            s1 = s1 + as[i] + "\t";
        }
        return s1;
    }
}
